 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  * Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
  * font should be activated and used by other components.
  *******************************************************************************/

 package org.eclipse.ui.dialogs;

 import java.util.ArrayList ;
 import java.util.Iterator ;

 import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.ICheckStateListener;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
 import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
 import org.eclipse.ui.internal.ide.misc.CheckboxTreeAndListGroup;
 import org.eclipse.ui.model.WorkbenchContentProvider;
 import org.eclipse.ui.model.WorkbenchLabelProvider;
 import org.eclipse.ui.model.WorkbenchViewerComparator;

 /**
  * A standard file selection dialog which solicits a list of files from the user.
  * The <code>getResult</code> method returns the selected files.
  * <p>
  * This class may be instantiated; it is not intended to be subclassed.
  * </p>
  * <p>
  * Example:
  * <pre>
  * FileSelectionDialog dialog =
  * new FileSelectionDialog(getShell(), rootElement, msg);
  * dialog.setInitialSelections(selectedResources);
  * dialog.open();
  * return dialog.getResult();
  * </pre>
  * </p>
  * @deprecated Use org.eclipse.swt.widgets.FileDialog,
  */
 public class FileSelectionDialog extends SelectionDialog {
     // the root file representative to populate the viewer with
 private FileSystemElement root;

     // the visual selection widget group
 CheckboxTreeAndListGroup selectionGroup;

     // expand all items in the tree view on dialog open
 private boolean expandAllOnOpen = false;

     // sizing constants
 private static final int SIZING_SELECTION_WIDGET_WIDTH = 500;

     private static final int SIZING_SELECTION_WIDGET_HEIGHT = 250;

     /**
      * Creates a file selection dialog rooted at the given file system element.
      *
      * @param parentShell the parent shell
      * @param fileSystemElement the root element to populate this dialog with
      * @param message the message to be displayed at the top of this dialog, or
      * <code>null</code> to display a default message
      */
     public FileSelectionDialog(Shell parentShell,
             FileSystemElement fileSystemElement, String message) {
         super(parentShell);
         setTitle(IDEWorkbenchMessages.FileSelectionDialog_title);
         root = fileSystemElement;
         if (message != null) {
             setMessage(message);
         } else {
             setMessage(IDEWorkbenchMessages.FileSelectionDialog_message);
         }
     }

     /**
      * Add the selection and deselection buttons to the dialog.
      * @param composite org.eclipse.swt.widgets.Composite
      */
     private void addSelectionButtons(Composite composite) {

         Composite buttonComposite = new Composite(composite, SWT.RIGHT);
         GridLayout layout = new GridLayout();
         layout.numColumns = 2;
         buttonComposite.setLayout(layout);
         GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
         composite.setData(data);

         Button selectButton = new Button(buttonComposite, SWT.PUSH);
         selectButton.setText(SELECT_ALL_TITLE);
         SelectionListener listener = new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
                 selectionGroup.setAllSelections(true);
             }
         };
         selectButton.addSelectionListener(listener);

         Button deselectButton = new Button(buttonComposite, SWT.PUSH);
         deselectButton.setText(DESELECT_ALL_TITLE);
         listener = new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
                 selectionGroup.setAllSelections(false);

             }
         };
         deselectButton.addSelectionListener(listener);

     }

     /**
      * Visually checks the previously-specified elements in the container (left)
      * portion of this dialog's file selection viewer.
      */
     private void checkInitialSelections() {
         Iterator itemsToCheck = getInitialElementSelections().iterator();

         while (itemsToCheck.hasNext()) {
             FileSystemElement currentElement = (FileSystemElement) itemsToCheck
                     .next();

             if (currentElement.isDirectory()) {
                 selectionGroup.initialCheckTreeItem(currentElement);
             } else {
                 selectionGroup.initialCheckListItem(currentElement);
             }
         }
     }

     /* (non-Javadoc)
      * Method declared in Window.
      */
     protected void configureShell(Shell shell) {
         super.configureShell(shell);
         PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
                 IIDEHelpContextIds.FILE_SELECTION_DIALOG);
     }

     public void create() {
         super.create();
         initializeDialog();
     }

     /* (non-Javadoc)
      * Method declared on Dialog.
      */
     protected Control createDialogArea(Composite parent) {
         // page group
 Composite composite = (Composite) super.createDialogArea(parent);

         createMessageArea(composite);

         // Create a fake parent of the root to be the dialog input element.
 // Use an empty label so that display of the element's full name
 // doesn't include a confusing label
 FileSystemElement input = new FileSystemElement("", null, true);//$NON-NLS-1$
 input.addChild(root);
         root.setParent(input);

         selectionGroup = new CheckboxTreeAndListGroup(composite, input,
                 getFolderProvider(), new WorkbenchLabelProvider(),
                 getFileProvider(), new WorkbenchLabelProvider(), SWT.NONE,
                 SIZING_SELECTION_WIDGET_WIDTH, // since this page has no other significantly-sized
 SIZING_SELECTION_WIDGET_HEIGHT); // widgets we need to hardcode the combined widget's
 // size, otherwise it will open too small

         ICheckStateListener listener = new ICheckStateListener() {
             public void checkStateChanged(CheckStateChangedEvent event) {
                 getOkButton().setEnabled(
                         selectionGroup.getCheckedElementCount() > 0);
             }
         };

         WorkbenchViewerComparator comparator = new WorkbenchViewerComparator();
         selectionGroup.setTreeComparator(comparator);
         selectionGroup.setListComparator(comparator);
         selectionGroup.addCheckStateListener(listener);

         addSelectionButtons(composite);

         return composite;
     }

     /**
      * Returns whether the tree view of the file system element
      * will be fully expanded when the dialog is opened.
      *
      * @return true to expand all on dialog open, false otherwise.
      */
     public boolean getExpandAllOnOpen() {
         return expandAllOnOpen;
     }

     /**
      * Returns a content provider for <code>FileSystemElement</code>s that returns
      * only files as children.
      */
     private ITreeContentProvider getFileProvider() {
         return new WorkbenchContentProvider() {
             public Object [] getChildren(Object o) {
                 if (o instanceof FileSystemElement) {
                     return ((FileSystemElement) o).getFiles().getChildren(o);
                 }
                 return new Object [0];
             }
         };
     }

     /**
      * Returns a content provider for <code>FileSystemElement</code>s that returns
      * only folders as children.
      */
     private ITreeContentProvider getFolderProvider() {
         return new WorkbenchContentProvider() {
             public Object [] getChildren(Object o) {
                 if (o instanceof FileSystemElement) {
                     return ((FileSystemElement) o).getFolders().getChildren(o);
                 }
                 return new Object [0];
             }
         };
     }

     /**
      * Initializes this dialog's controls.
      */
     private void initializeDialog() {
         // initialize page
 if (getInitialElementSelections().isEmpty()) {
             getOkButton().setEnabled(false);
         } else {
             checkInitialSelections();
         }
         selectionGroup.aboutToOpen();
         if (expandAllOnOpen) {
             selectionGroup.expandAll();
         }
     }

     /**
      * The <code>FileSelectionDialog</code> implementation of this
      * <code>Dialog</code> method builds a list of the selected files for later
      * retrieval by the client and closes this dialog.
      */
     protected void okPressed() {
         Iterator resultEnum = selectionGroup.getAllCheckedListItems();
         ArrayList list = new ArrayList ();
         while (resultEnum.hasNext()) {
             list.add(resultEnum.next());
         }
         setResult(list);
         super.okPressed();
     }

     /**
      * Set whether the tree view of the file system element
      * will be fully expanded when the dialog is opened.
      *
      * @param expandAll true to expand all on dialog open, false otherwise.
      */
     public void setExpandAllOnOpen(boolean expandAll) {
         expandAllOnOpen = expandAll;
     }
 }

